package com.gzsxy.esjy.redis.extend;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface RedisService {

    /**
     * 保留字符串数据
     *
     * @param key   键
     * @param value 值
     */
    void setString(String key, String value);

    /**
     * 保留字符串数据
     *
     * @param key   键
     * @param value 值
     * @param time  失效时间（秒）
     */
    void setString(String key, String value, long time);

    /**
     * 获取字符串数据
     *
     * @param key 键
     */
    String getString(String key);

    /**
     * 设置值
     *
     * @param key   键
     * @param value 值
     */
    void setValue(String key, Object value);

    /**
     * 设置值
     *
     * @param key   键
     * @param value 值
     * @param time  失效时间（秒）
     */
    void setValue(String key, Object value, long time);

    /**
     * 获得数据
     *
     * @param key 键
     */
    Object getValue(String key);

    /**
     * 获得数据
     *
     * @param key   键
     * @param clazz 泛型
     */
    <T> T getValue(String key, Class<T> clazz);


    /**
     * 获得数据
     *
     * @param key   键
     * @param clazz 泛型
     */
    Object getObject(String key, Class<?> clazz);

    /**
     * 设置超时时间
     *
     * @param key    键
     * @param expire 过期时间
     */
    boolean expire(String key, long expire);

    /**
     * 删除数据
     *
     * @param key 键
     */
    void remove(String key);

    /**
     * 按键设置属性和属性值 （hash）
     *
     * @param key     键
     * @param hashKey 属性
     * @param value   属性值
     */
    void put(String key, String hashKey, Object value);

    /**
     * 按键设置map属性
     *
     * @param key 键
     * @param map
     */
    void putAll(String key, Map<String, Object> map);


    /**
     * 按键设置对象属性
     *
     * @param key 键
     * @param dto
     */
    void putDto(String key, Object dto);

    /**
     * 按key，和hashkeys删除
     *
     * @param key      键
     * @param hashKeys 属性 （多个）
     * @return 成功个数
     */
    Long deleteHashKeys(String key, String... hashKeys);

    /**
     * 按键和属性获得属性值
     *
     * @param key     键
     * @param hashKey 属性
     * @return 属性值
     */
    Object get(String key, String hashKey);


    /**
     * 获取dto
     *
     * @param key 键
     */
    <R> R getDto(String key, Class<R> r);

    /**
     * 获取
     *
     * @param key 键
     */
    Map<String, Object> getMap(String key);


    /**
     * 按键获取属性列表
     *
     * @param key 键
     * @return Set  集合
     */
    Set<String> hashKeys(String key);

    /**
     * 按键获取属性值列表
     *
     * @param key 键
     * @return List  列表
     */
    List<Object> hashValues(String key);


    /**
     * 获取锁/检验锁
     *
     * @param key      键
     * @param unLockId 解锁所需要的id
     * @param time     锁生效最大时间（秒）
     * @return 存在锁 false，不存在 true
     */
    boolean getLock(String key, String unLockId, long time);


    /**
     * 主动释放锁
     *
     * @param key      键
     * @param unLockId 解锁所需要的id
     */
    void unLock(String key, String unLockId);

    /**
     * 递增
     *
     * @param key   键
     * @param delta 要增加几（大于0）
     */
    long incr(String key, long delta);

    /**
     * 递减
     *
     * @param key   键
     * @param delta 要减少几（小于0）
     */
    long decr(String key, long delta);


    /**
     * hash递增，如果不存在，就会创建一个，并把新增后的值返回
     *
     * @param key  键
     * @param item 项
     * @param by   要增加几（大于0）
     */
    double hincr(String key, String item, double by);


    /**
     * hash递减
     *
     * @param key  键
     * @param item 项
     * @param by   要减少几（小于0）
     */
    double hdecr(String key, String item, double by);


    Set<Object> sGet(String key);

    boolean sHasKey(String key, Object value);


    long sSet(String key, Object[] values);


    long sGetSetSize(String key);


    long setRemove(String key, Object[] values);

    long IRemove(String key, long count, Object value);

    boolean IUpdateIndex(String key, long index, Object value);

    boolean ISet(String key, List<Object> value);

    boolean ISet(String key, Object value);

    Object IGetIndex(String key, long index);

    long IGetListSize(String key);

    List<Object> lGet(String key, long start, long end);

    <T> List<T> getList(String key, Class<T> clazz);

    /**
     * 判断key是否存在
     *
     * @param key
     * @return
     */
    boolean exists(String key);

}
